En este material encontrarĆ”s una guĆa completa para aprender a crear y personalizar diferentes tipos de grĆ”ficos para visualizar tus datos de manera efectiva. Desde grĆ”ficos bĆ”sicos como histogramas y diagramas de dispersión, hasta grĆ”ficos mĆ”s avanzados como barras apiladas y diagramas de violĆn, aquĆ podrĆ”s aprender cómo utilizar las funciones de R base y el tan utilizado paquete {ggplot2} para crear grĆ”ficos atractivos y significativos. AdemĆ”s, encontrarĆ”s código en R y explicaciones detalladas para ayudarte a entender el proceso detrĆ”s de cada grĆ”fico. Ā”Comencemos a explorar el mundo de la visualización de datos!
Realizaremos un grÔfico rÔpido con la función plot() utilizando el dataset pressure del paquete de R {datasets} que viene precargado.
plot(pressure)
En primer lugar, R observa que el data frame tiene dos columnas, por lo que asume que queremos graficar una columna frente a la otra. En segundo lugar, ya que no se proporcionan etiquetas para los ejes, R utiliza los nombres de las columnas. En tercer lugar, se crean marcas de graduacion del eje en numeros enteros.
Estos grÔficos tienen la ventaja de dar rÔpidamente una visualización de nuestro dataset.
PodrĆamos querer graficar otras columnas o en distinto orden por lo que es conveniente siempre indicar x e y. AdemĆ”s proporcionamos el tipo de grĆ”fico que queremos (type).
plot(x = pressure$temperature, y = pressure$pressure, type = 'p')
Esto resulta en un grĆ”fico simple. AĆŗn asĆ, R nos permite modificar aspectos estĆ©ticos del grĆ”fico: point shape (pch), color (col), lĆmites de ejes (xlim e ylim), etiquetas de ejes (xlab e ylab), tĆtulo (main), entre otros.
plot(x = pressure$temperature, y = pressure$pressure, type = 'p',
pch = 19, col="red", xlim = c(0, 400),
xlab = "Temperature", ylab = "Pressure", main = "GrƔfico de puntos")
Mismo grĆ”fico anterior pero ahora indicamos type = "l" para obtener un grĆ”fico de lĆneas.
plot(pressure$temperature, pressure$pressure, type = "l",
xlab = "Temperature", ylab = "Pressure", main = "GrĆ”fico de lĆneas")
Dentro de {datasets} tenemos datos de Biochemical Oxygen Demand (BOD) que tiene dos columnas (Time y demand). Graficaremos la demanda de oxĆgeno en los distintos tiempos.
barplot(BOD$demand, names.arg = BOD$Time, ylim = c(0, 20),
xlab = "Time", ylab = "Biochemical Oxygen Demand", main = "GrƔfico de barras")
Otros datos dentro de {datasets} pertenecen a Motor Trend Car Road Tests (mtcars). Haremos un histograma de la variable numƩrica mpg (Miles/(US) gallon).
hist(mtcars$mpg, breaks = 10, xlim = c(10, 35),
xlab = "Miles/(US) gallon", main = "Histograma")
Ahora utilizaremos el dataset ToothGrowth para realizar un grƔfico de cajas o boxplot.
Se grafica la longitud de los odontoblastos (células responsables del crecimiento de los dientes) medidas en 60 cobayos comparando dos métodos de administración de vitamina C: jugo de naranja (OJ) o Ôcido ascórbico (VC).
boxplot(len ~ supp, data = ToothGrowth,
xlab = "Delivery methods", ylab = "Tooth length", main = "GrƔfico de cajas")
Realizar grÔficos con R base, sin la utilización de un paquete, tiene la ventaja de utilizar funciones simples como plot(), barplot(), hist() y boxplot(). Como se pudo observar, son grÔficos de apariencia sencilla pero fÔciles y rÔpidos de realizar para un primer anÔlisis exploratorio de los datos. Ahora veremos cómo realizar grÔficos en R con el paquete {ggplot2} en los que podremos personalizar y darle un aspecto mÔs profesional a nuestros grÔficos.
El paquete {ggplot2} de R es el mÔs utilizado para la visualización de datos. Forma parte del conjunto de paquetes llamado {tidyverse}. Utilizaremos la versión 3.4.1 de {ggplot2}.
Los principales elementos para representar un grƔfico con {ggplot2} son los siguientes:
Normalmente los geoms se van aƱadiendo de forma consecutiva en distintas capas (layers). Para aƱadir una nueva capa se usa el signo +.
Otros elementos importantes de un grĆ”fico en {ggplot2}, que pueden estar o no presentes, son: Stats (transformaciones estadĆsticas), Facets (grĆ”ficos en paneles por grupo), Scales (controla tĆtulos, etiquetas, ejes), Themes (estilo de grĆ”ficos).
La estructura general del código para obtener un grÔfico es:
ggplot(data = 'nombre del data frame') +
geom_nombre1(aes(aesthetics1 = var1, aesthetics2 = var2, ...)) +
geom_nombre2(...)
El comando ggplot() se usa para generar el sistema de coordenadas (por defecto, rectangulares) y posteriormente vamos aƱadiendo los geoms con sus correspondientes aesthetics. En principio los aesthetics se pueden asignar individualmente para cada geom.
Vamos a utilizar datos provenientes del paquete {agridat} que proporciona una amplia colección de conjuntos de datos de experimentos agrĆcolas provenientes de papers, libros y websites. Documentación: https://cran.rstudio.com/web/packages/agridat/agridat.pdf
# Cargar el paquete
library(agridat)
# Cargar el dataset
soybean <- australia.soybean
# Estructura dataset
str(soybean)
## 'data.frame': 464 obs. of 10 variables:
## $ env : Factor w/ 8 levels "B70","B71","L70",..: 3 3 3 3 3 3 3 3 3 3 ...
## $ loc : Factor w/ 4 levels "Brookstead","Lawes",..: 2 2 2 2 2 2 2 2 2 2 ...
## $ year : int 1970 1970 1970 1970 1970 1970 1970 1970 1970 1970 ...
## $ gen : Factor w/ 58 levels "G01","G02","G03",..: 1 2 3 4 5 6 7 8 9 10 ...
## $ yield : num 2.39 2.28 2.57 2.88 2.39 ...
## $ height : num 1.45 1.45 1.46 1.26 1.33 ...
## $ lodging: num 4.25 4.25 3.75 3.5 3.5 4 3 3.25 3 3.75 ...
## $ size : num 8.45 9.95 10.85 10.05 11 ...
## $ protein: num 36.7 37.5 37.8 38.5 37.5 ...
## $ oil : num 20.9 20.7 21.3 22 22.1 ...
Podemos observar que el data frame tiene 464 observaciones con 10 variables:
Por una cuestión de tipo de dato para trabajar mÔs adelante, convertiremos year a factor de la siguiente manera:
soybean$year <- as.factor(soybean$year)
class(soybean$year) # comprobamos conversión
## [1] "factor"
| env | loc | year | gen | yield | height | lodging | size | protein | oil |
|---|---|---|---|---|---|---|---|---|---|
| L70 | Lawes | 1970 | G01 | 2.387 | 1.445 | 4.25 | 8.45 | 36.70 | 20.895 |
| L70 | Lawes | 1970 | G02 | 2.282 | 1.450 | 4.25 | 9.95 | 37.55 | 20.740 |
| L70 | Lawes | 1970 | G03 | 2.567 | 1.460 | 3.75 | 10.85 | 37.80 | 21.295 |
| L70 | Lawes | 1970 | G04 | 2.877 | 1.260 | 3.50 | 10.05 | 38.45 | 21.990 |
| L70 | Lawes | 1970 | G05 | 2.392 | 1.335 | 3.50 | 11.00 | 37.50 | 22.130 |
| L70 | Lawes | 1970 | G06 | 2.408 | 1.360 | 4.00 | 11.75 | 38.25 | 21.160 |
# Cargar el paquete {ggplot2}
library(ggplot2)
Para crear un grƔfico se usa el comando ggplot():
ggplot(data = soybean)
Hasta acƔ solo asignamos al grƔfico el conjunto de datos que queremos visualizar. No se representa grƔficamente nada hasta que no se aƱaden mƔs capas.
Las capas sirven para proporcionar información sobre cómo queremos visualizar los datos. Esto se lleva a cabo a través de un geom. Este es un ejemplo sencillo usando geom_point() que es el geom correspondiente un diagrama de dispersión (cada tipo de grÔfico tiene el suyo). En primer lugar, mediante aes() asignamos las coordenadas x e y.
ggplot(data = soybean) +
geom_point(aes(x = size, y = yield))
Los grÔficos de dispersión son grÔficos de puntos que se usan para averiguar la intensidad de la relación entre dos variables numéricas.
Si queremos añadir información sobre la localidad lo podemos hacer a partir de diferentes colores, especificando que el color de los puntos dependa de la variable loc:
ggplot(data = soybean) +
geom_point(aes(x = size, y = yield, col = loc))
El argumento aes() (aesthetics) asigna variables a ciertos aspectos del grƔfico. En general, cada geom admitirƔ un conjunto determinado de aesthetics. En el caso particular de geom_point, mediante aes() podemos hacer depender de una variable otros aspectos como la forma o el tamaƱo de los puntos. Por ejemplo, para tomar una aesthetic como forma necesitamos una variable del tipo factor de la siguiente forma:
ggplot(data = soybean) +
geom_point(aes(x = size, y = yield, shape= year)) # una forma para cada aƱo
En este ejemplo podemos querer distinguir las distintas localidades y los dos años de evaluación, por lo que podemos agregar mÔs de un aspecto al grÔfico:
ggplot(data = soybean) +
geom_point(aes(x = size, y = yield, shape = year, col = loc))
Estos aspectos se pueden fijar en lugar de hacerlos depender de una variable. En este caso el valor del argumento se asigna fuera de la lista de aesthetics. Es necesario consultar la web de {ggplot2} para saber qué aesthetics admite cada geom en particular. También se puede consultar la documentación directamente desde Help en RStudio o tipeando el comando ?geom_point en consola.
En el siguiente ejemplo se fijó el color de los puntos, su tamaño y el grado de transparencia, lo que es útil cuando hay muchos puntos:
ggplot(data = soybean) +
geom_point(aes(x = size, y = yield),
col = 'darkblue', # color de los puntos
size = 3, # tamaƱo de los puntos
alpha = 0.3) # nivel de transparencia de los puntos
Algunos geoms requieren llevar a cabo alguna transformación estadĆstica (stat) que toma un conjunto de datos y crea otro nuevo. De esta forma combinando geom y stat se pueden obtener una gran variedad de visualizaciones. A veces se puede asignar una transformación estadĆstica a un geom mediante el argumento method. Por ejemplo, geom_smooth() usa distintos mĆ©todos para estimar la curva de regresión de una variable por otra, incluyendo el mĆ©todo de mĆnimos cuadrados, que es el mĆ”s conocido:
ggplot(data = soybean) +
geom_point(aes(x = size, y = yield),
col = 'darkblue',
size = 3,
alpha = 0.3) +
geom_smooth(aes(x = size, y = yield), method = 'lm') # AƱade la recta
## `geom_smooth()` using formula = 'y ~ x'
Vemos el siguiente mensaje en consola: geom_smooth() using formula 'y ~ x'. Esto nos estĆ” advirtiendo que por defecto estĆ” graficando y en función de x, uno podrĆa especificarlo o querer graficar una relación diferente, por ejemplo logarĆtmica formula = 'y ~ log(x)' o una cuadrĆ”tica formula = 'y ~ x + I(x^2)'. Incluso podemos graficar mĆ”s de una para comparar usando dos geom_smooth() por separado.
ggplot(data = soybean) +
geom_point(aes(x = size, y = yield),
col = 'darkblue',
size = 3,
alpha = 0.3) +
geom_smooth(aes(x = size, y = yield), method = 'lm', formula = 'y ~ x', col = 'blue') + # lineal
geom_smooth(aes(x = size, y = yield), method = 'lm', formula = 'y ~ x + I(x^2)', col = 'red') # cuadrƔtica
Ahora que aƱadimos un nuevo geom podemos analizar que la asignación de las coordenadas x e y a las variables podrĆa haberse hecho directamente en la primera lĆnea obteniendo mismos resultados y evitando repetir tanto código.
ggplot(data = soybean, aes(x = size, y = yield)) + # Esta asignación se fija para todos los geoms
geom_point(col = 'darkblue', size = 3, alpha = 0.3) +
geom_smooth(method = 'lm', formula = 'y ~ x')
La repetición de los aes() en cada geom tiene la ventaja de permitir hacer una asignación a variables diferentes en cada uno de ellos en lugar de mantener la asignación fija para todos.
Con geom_smooth() vemos que se representa el intervalo de confianza. En el siguiente ejemplo lo eliminamos y, ademƔs, modificamos otros aspectos estƩticos del grƔfico:
# Modificamos algunos aspectos estƩticos del grƔfico:
ggplot(data = soybean, aes(x = size, y = yield)) +
geom_point(col = 'darkblue',
size = 3,
alpha = 0.3) +
geom_smooth(method = 'lm', formula = 'y ~ x',
col = 'black', # recta en color negro
se=FALSE) # Se eliminan el intervalo de confianza (se=standard error)
Si asignamos el tipo de lĆnea a la localidad, obtendremos las rectas de mĆnimos cuadrados para las cuatro localidades:
ggplot(data = soybean, aes(x = size, y = yield)) +
geom_point(col = 'darkblue',
size = 3,
alpha = 0.3) +
geom_smooth(aes(linetype = loc),
method = 'lm', formula = 'y ~ x',
col = 'black', # Se representa la recta en color negro
se=FALSE) # Se eliminan las bandas de confianza (se=standard error)
En el grƔfico anterior estamos mostrando muchas cosas en un solo grƔfico. Puede ser conveniente representar un grƔfico para cada una de las localidades por separado, es decir, por grupos. Los facets, otro elemento importante en {ggplot2}, determinan que se debe representar un grƔfico condicionado a cada uno de los valores de alguna de las variables. Se aƱaden de la siguiente forma:
ggplot(data = soybean, aes(x = size, y = yield)) +
geom_point(col = 'darkblue',
size = 3,
alpha = 0.3) +
geom_smooth(method = 'lm', formula = 'y ~ x',
col = 'black',
se=FALSE) +
facet_wrap( ~ loc) # un grƔfico para cada localidad
Podemos aƱadir un tĆtulo o cambiar las etiquetas de los ejes aƱadiendo una nueva capa con el comando labs(). Para modificar los lĆmites de los ejes usamos xlim() e ylim(). TambiĆ©n se pueden modificar los lĆmites de variables continuas (x e y) con scale_x_continuous() y scale_y_continuous().
ggplot(data = soybean, aes(x = size, y = yield)) +
geom_point(col = 'darkblue',
size = 3,
alpha = 0.3) +
geom_smooth(method = 'lm', formula = 'y ~ x',
col = 'black',
se=FALSE) +
facet_wrap( ~ loc) +
# tĆtulos y etiquetas ejes:
labs(title='Australia soybean',
x='Size (millimeters)',
y='Yield (metric tons / hectare)') +
# lĆmites ejes 2 formas:
xlim(3, 25) +
scale_y_continuous(limits = c(0, 5))
TambiƩn se puede elegir escalas de colores manuales con scale_color_manual(). Se debe especificar en aes() quƩ variable se desea colorear y eliminar cualquier color fijo dentro del geom.
ggplot(data = soybean, aes(x = size, y = yield, col = loc)) + # color por localidad
geom_point(size = 3, alpha = 0.5) + # No dejamos color fijo
geom_smooth(method = 'lm', formula = 'y ~ x',
col = 'black',
se=FALSE) +
facet_wrap( ~ loc) +
labs(title='Australia soybean',
x='Size (millimeters)',
y='Yield (metric tons / hectare)') +
scale_color_manual(values=c('#6baed6','#4292c6','#2171b5','#084594')) # escala colores
Hasta ahora usamos el estilo de grĆ”ficos por defecto con su caracterĆstico fondo gris. Se puede cambiar aƱadiendo una nueva capa. usando diferentes themes.
En el siguiente grƔfico donde analizamos cada localidad-aƱo (env) cambiamos a theme_bw():
ggplot(data = soybean, aes(x = size, y = yield)) +
geom_point(col = 'darkblue',
size = 3,
alpha = 0.3) +
geom_smooth(method = 'lm', formula = 'y ~ x',
col = 'black',
se=FALSE) +
facet_wrap( ~ env, nrow = 4) + # nrow: indicamos nĆŗmero de filas
labs(title='Australia soybean',
x='Size (millimeters)',
y='Yield (metric tons / hectare)') +
theme_bw()
Vamos a graficar algunos ejemplos de los tipos de grĆ”ficos mĆ”s utilizados: lĆneas, barras, histogramas y diagramas de cajas (boxplots).
Los grĆ”ficos de lĆneas muestran una serie como un conjunto de puntos conectados mediante una sola lĆnea. Los grĆ”ficos de lĆneas se usan para representar datos que tienen lugar durante un perĆodo continuado de tiempo. En {ggplot2} aƱadimos una capa con el comando geom_line().
En este caso tomaremos datos de 9 aƱos (1974-1982) de la altura de cebada.
# Dataset cebada
barley <- aastveit.barley.height
str(barley)
## 'data.frame': 135 obs. of 3 variables:
## $ year : int 1974 1975 1976 1977 1978 1979 1980 1981 1982 1974 ...
## $ gen : Factor w/ 15 levels "G01","G02","G03",..: 1 1 1 1 1 1 1 1 1 2 ...
## $ height: num 81 67.3 71.5 64.3 55.8 84.9 86.2 88 72 72.3 ...
Si observamos el dataset posee 15 genotipos de cebada, haremos un subset de nuestros datos y veremos cómo varió la altura en un dado genotipo (G01) a través de los años. {ggplot2} nos permite generar el subset dentro de ggplot() para evitar generar un nuevo data frame.
ggplot(data = subset(barley, gen == "G01")) +
geom_line(aes(x = year, y = height))
Si queremos analizar todos los genotipos, con un facet por genotipo podemos diferenciarlos en distintos grĆ”ficos. Para trabajar un poco mĆ”s la estĆ©tica del grĆ”fico podemos ensanchar la lĆnea (linewidth) y colorearla de azul (color), se puede querer agregar puntos a travĆ©s de una nueva capa utilizando geom_point() y cambiar a theme_bw().
ggplot(data = barley, aes(x = year, y = height)) + # tomando el dataset completo
geom_line(color = 'blue', linewidth = 1.2) + # color y grosor de la lĆnea
geom_point() + # agregamos puntos
facet_wrap( ~ gen) + # agrupamos por genotipo
labs(title='Barley heights in Norway',
x='Year',
y='Height (cm)') +
theme_bw()
Los grĆ”ficos de barras se utilizan para representar una variable categórica o variables cuantitativas discretas. Se representan barras verticales proporcionales a los valores de la variable en cada categorĆa o valor. Para crear grĆ”ficos de barras con {ggplot2} se usa geom_bar().
Para hacer nuestro primer grÔfico de barras vamos a utilizar un dataset de corderos que contiene la variable categórica raza (breed) y graficaremos cuÔntos individuos hay de cada una de las 3 razas.
# Dataset corderos
lamb <- alwan.lamb
str(lamb)
## 'data.frame': 340 obs. of 11 variables:
## $ year : int 1980 1980 1980 1980 1980 1980 1980 1980 1980 1980 ...
## $ breed: Factor w/ 3 levels "BR","BRP","PP": 3 3 3 3 3 3 3 3 3 3 ...
## $ sex : Factor w/ 2 levels "F","M": 1 1 1 1 1 2 2 2 2 2 ...
## $ sire0: Factor w/ 34 levels "S01","S02","S03",..: 3 3 3 3 3 3 3 3 3 3 ...
## $ shape: Factor w/ 5 levels "LF1","LF2","LF3",..: 5 4 3 2 1 5 4 3 2 1 ...
## $ count: int 31 17 0 0 0 21 8 0 0 0 ...
## $ sire : Factor w/ 34 levels "S01","S02","S03",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ yr : int 1 1 1 1 1 1 1 1 1 1 ...
## $ b1 : int 1 1 1 1 1 1 1 1 1 1 ...
## $ b2 : int 0 0 0 0 0 0 0 0 0 0 ...
## $ b3 : int 0 0 0 0 0 0 0 0 0 0 ...
# GrƔfico
ggplot(lamb, aes(breed)) +
geom_bar()
Usando geom_text() podemos agregar como texto el valor del count sobre las barras:
# GrƔfico
ggplot(lamb, aes(breed)) +
geom_bar() +
geom_text(stat='count', aes(label=after_stat(count)), vjust=-0.5)
Ahora invertimos las barras con cord_flip():
ggplot(lamb, aes(breed)) +
geom_bar(fill = "darkblue") +
labs(title='Lambs',
x='Breed',
y='Count') +
coord_flip() # invertimos ejes
Si tuvieramos estos datos ya contabilizados en una tabla de frecuencias, tendremos que especificar en aes() que la variable y a graficar es la variable con las frecuencias. AdemƔs tendramos que usar geom_bar(stat = "identity") o directamente usar geom_col() que ya usa por defecto stat_identity().
Veamos con un ejemplo. Replicamos los nĆŗmeros anteriores armando nuestro propio data frame con el nĆŗmero total de cada raza.
# Data frame
df <- data.frame (breed = c("BR", "BRP", "PP"),
n = c(30, 180, 130))
# GrƔfico de barras especificando x e y, usando geom_bar(stat = "identity")
ggplot(df, aes(x = breed, y = n)) +
geom_bar(stat = "identity", fill = "darkblue") +
labs(title='Con geom_bar(stat = "identity")')
# Con geom_col()
ggplot(df, aes(x = breed, y = n)) +
geom_col(fill = "steelblue") +
labs(title='Con geom_col()')
Podemos querer darle un orden a las barras de menor a mayor basado en el n. Para ello usamos reorder(). Ordenamos la variable x (breed) en base a la variable y (n) especificando x = reorder(breed, n) en el siguiente código:
ggplot(df, aes(x = reorder(breed, n), y = n)) +
geom_col(fill = "steelblue")
Un histograma es un grÔfico de una variable en forma de barras que se utiliza para representar la distribución de frecuencias de una variable. Para graficar un histograma se usa geom_histogram().
Volviendo al dataset de soja, veamos el histograma para proteĆna. Con las opciones por defecto resulta:
ggplot(data = soybean) +
geom_histogram(aes(x = protein))
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Con el siguiente código añadimos un y= after_stat(density) para graficar las frecuencias relativas, cambiamos el número de rectÔngulos del histograma (bins), los colores y otros aspectos del grÔfico:
ggplot(data = soybean) +
geom_histogram(aes(x = protein,
y= after_stat(density)), # para que el Ɣrea sea 1, frec relativas
bins=20,
fill='blue', # color barra
col='black') + # color contorno
labs(x = 'Protein (%)', y = 'Relative frequency', title = 'Histogram') +
facet_wrap( ~ loc, nrow = 2) +
theme_bw() +
theme(panel.grid = element_blank()) # elimina la grilla de fondo
Los diagramas de caja o boxplots, tambiĆ©n conocidos como diagramas de cajas y bigotes, son una representación grĆ”fica que permite resumir las caracterĆsticas principales de los datos (posición, dispersión, asimetrĆa) e identificar la presencia de valores atĆpicos. Para representar diagramas de cajas se usa geom_boxplot().
La caja estĆ” atravesada por una lĆnea (la mediana o Q2), su base representa el Q1 y su parte superior, el Q3. Las lĆneas exteriores representan Q1 - 1.5 IQR y Q3 + 1.5 IQR (IQR: rango intercuartil). Los puntos corresponden a valores atĆpicos (outliers).
Ahora tomaremos un dataset de lechuga que posee medidas de peso (weight) de varias plantas (n = 18) en distintos dĆas de observacion para 3 tratamientos (trt).
# Dataset lechuga
lettuce <- pederson.lettuce.repeated
str(lettuce)
## 'data.frame': 594 obs. of 4 variables:
## $ plant : int 1 2 3 4 5 6 7 8 9 10 ...
## $ day : int 1 1 1 1 1 1 1 1 1 1 ...
## $ trt : Factor w/ 3 levels "T1","T2","T3": 1 1 1 1 1 1 1 1 1 1 ...
## $ weight: num 44 48.4 55.5 48.6 48.1 42.6 55.4 47.5 48.8 51.2 ...
Supongamos que queremos analizar las observaciones hechas en el Ćŗltimo dĆa de medición (a los 40 dĆas) y comparar los 3 tratamientos. Con las opciones por defecto resulta:
# GrƔfico de cajas
ggplot(data = subset(lettuce, day == 40)) +
geom_boxplot(aes(x = trt, y = weight))
Para cambiar los ejes se usa coord_flip(). Es posible aƱadir los puntos con otra capa usando geom_jitter(). Cambiaremos otros aspectos del grƔfico, obteniendo lo siguiente:
ggplot(data = subset(lettuce, day == 40)) +
geom_boxplot(aes(x = trt, y = weight),
col = 'black', fill = "#1134f7", alpha=0.75) + # relleno en código hex, alpha: transparencia
coord_flip() + # cambiar ejes
geom_jitter(aes(x = trt, y = weight), # agregar puntos
size = 3,
alpha = 0.5,
width = 0.1) +
labs(title='Boxplot',
x='Treatment',
y='Weight (g)') +
theme_classic()
Mientras que un boxplot muestra la distribución de datos a travĆ©s de cinco estadĆsticas numĆ©ricas y es mĆ”s adecuado para identificar valores atĆpicos, un grĆ”fico de violĆn muestra la distribución de datos como una densidad.
ggplot(data = subset(lettuce, day == 40), aes(x = trt, y = weight)) +
geom_violin()
Ambos grÔficos son útiles para visualizar la distribución de los datos y pueden ser utilizados en conjunto para una exploración mÔs completa de los datos. AdemÔs modificamos aspectos estéticos y obtenemos el siguiente grÔfico:
ggplot(data = subset(lettuce, day == 40), aes(x = trt, y = weight)) +
geom_violin(fill = "#9ecae1") +
geom_boxplot(width = 0.15) + # agregamos boxplot
geom_jitter(size = 2, alpha = 0.5, width = 0.05) + # agregamos puntos
labs(title='GrĆ”fico de violĆn',
x='Treatment',
y='Weight (g)') +
theme_classic()
En la siguiente animación se puede ver la progresión de un simple grÔfico a uno mÔs completo:
Para obtener el código de R para cada grafico, click aquĆ.
Un diagrama de barras apiladas muestra un valor numérico para un conjunto de entidades divididas en grupos y subgrupos. Por lo tanto, el conjunto de datos debe proporcionar al menos dos variables categóricas para los niveles de grupo (en eje x) y subgrupo (en fill).
ggplot(data = lamb, aes(x = breed, fill = sex)) +
geom_bar()
Puede realizarse la contabilización como en el caso anterior o graficarse una variable numérica especificÔndola como y y agregando geom_bar(stat = "identity").
Para mostrar las barras apiladas como un porcentaje se debe especificar position = "fill" dentro de geom_bar(). Asà se ve claramente la relación de las partes constituyentes con el todo, en este caso, para cada raza un 50% son hembras y un 50% son machos.
ggplot(data = lamb, aes(x = breed, fill = sex)) +
geom_bar(position = "fill")
Para que las barras estƩn una al lado de la otra se debe especificar position = "dodge" dentro de geom_bar().
ggplot(data = lamb, aes(x = sex, fill = breed)) +
geom_bar(position = "dodge")
Modificanmos el grƔfico eligiendo colores y modificando etiquetas:
ggplot(data = lamb, aes(x = sex, fill = breed)) +
geom_bar(position = "dodge") +
scale_fill_manual(values=c("#2171b5", "#9ecae1", "#08306b")) +
labs(title='GrƔfico de barras agrupadas',
x='Sex',
y='Count') +
theme_classic()
Hasta acƔ, todos nuestros grƔficos aparecieron en la ventana Plots de RStudio. Esta representa un dispositivo grƔfico (graphic device) donde se puede visualizar un grƔfico.
Para exportar un grÔfico existen diferentes formas que veremos a continuación.
Para exportar un grƔfico usamos alguna de las siguientes funciones, cada una corresponde con un tipo de archivo distinto: jpeg(), pdf(), png(), tiff().
Cada una de estas funciones tiene los siguientes argumentos tres argumentos principales:
También se puede especificar unit (para cambiar las unidades de ancho y alto), res (resolución en ppi), pointsize (tamaño del texto) y bg (color de fondo del grÔfico), entre otros.
La manera de utilizar estas funciones es llamÔndolas antes de llamar a una función que genere un grÔfico. Al hacer esto, le indicamos a R que en lugar de mandar nuestro grÔfico a una ventana del escritorio, lo mande a un dispositivo grÔfico distinto. Finalmente, llamamos a la función dev.off(), para cerrar el dispositivo grÔfico que hemos elegido, de este modo se crearÔ un archivo y podremos crear mÔs grÔficos después.
png(filename = "myfirstplot.png", width = 12, height = 6, units = "in", res = 300)
ggplot(data = soybean, aes(x = size, y = yield)) +
geom_point(col = 'darkblue',
size = 3,
alpha = 0.3) +
geom_smooth(method = 'lm', formula = 'y ~ x',
col = 'black',
se=FALSE) +
facet_wrap( ~ env, nrow = 4) +
labs(title='Australia soybean',
x='Size (millimeters)',
y='Yield (metric tons / hectare)') +
theme_bw()
dev.off()
ggsave() se puede guardar el grÔfico en png, jpeg, tiff, svg, eps, pdf, entre otros. Se especifica el nombre y el directorio, el ancho y alto en sus unidades ("in", "cm", "mm", or "px") y la resolución (dpi).my_plot <- ggplot(data = subset(lettuce, day == 40)) +
geom_boxplot(aes(x = trt, y = weight),
col = 'black', fill = "#1134f7", alpha=0.75) +
coord_flip() +
geom_jitter(aes(x = trt, y = weight),
size = 3,
alpha = 0.5,
width = 0.1) +
labs(title='Boxplot',
x='Treatment',
y='Weight (g)') +
theme_classic()
ggsave("mythirdplot.png", plot = my_plot, width = 12, height = 6, units = "in", dpi = 300)
Vamos a obtener el siguiente grƔfico siguiendo las consignas detalladas debajo.
Utilizando el dataset australia.soybean de {agridat}:
Cargar los paquetes necesarios
Convertir la variable year a factor
Copiar el siguiente grƔfico base para comenzar a trabajar:
ggplot(data = soybean, aes(x = height, y = protein)) +
geom_point(size = 3, alpha = 0.5)
Dividir el grƔfico en grupos/paneles en base al ambiente (env) y agregar nrow = 4 para obtener 4 filas
Modificar los puntos de geom_point() con color determinado por localidad y forma, por aƱo
Modificar theme a theme_bw()
Guardar grƔfico en png
## R version 4.2.2 (2022-10-31 ucrt)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 8.1 x64 (build 9600)
##
## Matrix products: default
##
## locale:
## [1] LC_COLLATE=English_United States.1252
## [2] LC_CTYPE=English_United States.1252
## [3] LC_MONETARY=English_United States.1252
## [4] LC_NUMERIC=C
## [5] LC_TIME=English_United States.1252
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] ggplot2_3.4.1 knitr_1.42 agridat_1.21
##
## loaded via a namespace (and not attached):
## [1] bslib_0.4.2 compiler_4.2.2 pillar_1.8.1 jquerylib_0.1.4
## [5] highr_0.10 tools_4.2.2 digest_0.6.31 lattice_0.20-45
## [9] nlme_3.1-160 jsonlite_1.8.4 evaluate_0.20 lifecycle_1.0.3
## [13] tibble_3.1.8 gtable_0.3.1 mgcv_1.8-41 pkgconfig_2.0.3
## [17] rlang_1.0.6 Matrix_1.5-1 cli_3.6.0 rstudioapi_0.14
## [21] yaml_2.3.7 xfun_0.37 fastmap_1.1.0 withr_2.5.0
## [25] dplyr_1.1.0 generics_0.1.3 vctrs_0.5.2 sass_0.4.5
## [29] grid_4.2.2 tidyselect_1.2.0 glue_1.6.2 R6_2.5.1
## [33] fansi_1.0.4 rmarkdown_2.20 farver_2.1.1 magrittr_2.0.3
## [37] splines_4.2.2 scales_1.2.1 htmltools_0.5.4 colorspace_2.1-0
## [41] labeling_0.4.2 utf8_1.2.3 munsell_0.5.0 cachem_1.0.6